package permission

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"gohub/app/models"
	"gohub/pkg/database"
)

type StringArray []string

// Permission 模型
type Permission struct {
	models.BaseModel

	PermissionName string           `json:"permissionName"`
	PermissionMark string           `json:"permissionMark"`
	PermissionDesc string           `json:"permissionDesc"`
	Children       ChildPermissions `gorm:"type:json;default:'[]'" json:"children"` // JSON数组存储子权限

	models.CommonTimestampsField
}

// 自定义类型处理子权限数组
type ChildPermissions []ChildPermission

// 子权限结构体
type ChildPermission struct {
	ID             string `json:"id"`
	PermissionName string `json:"permissionName"`
	PermissionMark string `json:"permissionMark"`
	PermissionDesc string `json:"permissionDesc"`
}

// Create 创建用户，通过 Permission.ID 来判断是否创建成功
func (permModel *Permission) Create() {
	database.DB.Create(&permModel)
}

func (permModel *Permission) Save() (rowsAffected int64) {
	result := database.DB.Save(&permModel)
	return result.RowsAffected
}

// Scan 实现Scanner接口（从数据库读取）
func (c *ChildPermissions) Scan(value interface{}) error {
	if value == nil {
		*c = ChildPermissions{}
		return nil
	}

	bytes, ok := value.([]byte)
	if !ok {
		return errors.New("字段必须是字节切片")
	}

	if len(bytes) == 0 {
		*c = ChildPermissions{}
		return nil
	}

	return json.Unmarshal(bytes, c)
}

// Value 实现Valuer接口（存入数据库）
func (c ChildPermissions) Value() (driver.Value, error) {
	if c == nil || len(c) == 0 {
		return "[]", nil
	}
	return json.Marshal(c)
}
